package stutool;

import java.util.ArrayList;
import java.util.Scanner;

public class UserLogin {
    public static void main(String[] args) {
        ArrayList<user> list = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        System.out.println("欢迎来到学生管理登陆系统！");
        loop :while(true){
            System.out.println("请选择操作:1.登陆 2.注册 3.忘记密码 4.退出");
            String input = sc.next();
            switch(input){
                case "1"-> login(list);
                case "2"-> register(list);
                case "3"-> forgetPassward(list);
                case "4"-> {
                    System.out.println("感谢使用，再见！");
                    break loop;//可以用System.exit(0);就不用标识了
                }
                default -> System.out.println("选择错误,请重新选择");
        }
        }
        sc.close();
    }
    //忘记密码
    public static void forgetPassward( ArrayList<user> list) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入你忘记密码的用户名:>");
        String wUserName = sc.next();
        //判断集合中是否有用户名
        int index = zhaoName(list, wUserName);
        if(index == -1){
            System.out.println("该用户名未注册");
            return ;
        }
        System.out.print("请输入你忘记密码的账号的身份证号:>");
        String wPersonId = sc.next();
        if(!list.get(index).getPersonid().equals(wPersonId)){
            System.out.println("身份证号验证失败，已退出");
            return ;
        }
        System.out.print("请输入你忘记密码的账号的手机号:>");
        String wPhoneNumber = sc.next();
        if(!list.get(index).getPhoneNumber().equals(wPhoneNumber)){
            System.out.println("手机号验证失败，已退出");
            return ;
        }
        System.out.print("请输入新密码:>");
        String wPassward1 = sc.next();
        System.out.print("请重复输入新密码:>");
        String wPassward2 = sc.next();
        if(!wPassward1.equals(wPassward2)){
            System.out.println("两次密码不一致，已退出");
            return ;
        }
        list.get(index).setPassward(wPassward1);
        System.out.println("密码更改成功！" + wUserName + "的密码已经是" + wPassward1 + "了！");
    }
    //注册
    public static void register( ArrayList<user> list) {
        //把用户信息添加到集合中
        Scanner sc = new Scanner(System.in);
        user u = new user();
        //输入用户名并确认是否可用
        while(true){
            System.out.print("请输入你的用户名:>");
            u.setUserName(sc.next()); 
            //确保用户名符合格式且唯一  
            if(!checkUserName(u.getUserName())){
                System.out.println("用户名不符合格式,请重新命名");
                continue;
            }
            if(!contains(list, u.getUserName())){
                System.out.println("该用户名已存在,请重新命名");
                continue;
            }
            break;
        }
        //判断输入两次密码是否相等
        while(true){
            System.out.print("请输入你的密码:>");
            String passward1 = sc.next();
            System.out.print("请重复输入你的密码:>");
            String passward2 = sc.next();
            if(!passward1.equals(passward2)){
                System.out.println("前后密码不一致,请重新输入！");
                continue;
            }
            u.setPassward(passward1);
            break;
        }
        //判断身份证是否有效
        while(true){
            System.out.print("请输入你的身份证号码:>");
            String personid0 = sc.next();
            if(!panDuanPersonId(personid0)){
                System.out.println("身份证号不符合规则,请重新输入！");
                continue;
            }
            u.setPersonid(personid0);
            break;
        }
        //判断输入的手机号是否有效
        while(true){
            System.out.print("请输入你的手机号:>");
            String personPhone = sc.next();
            if(!panDuanPhone(personPhone)){
                System.out.println("手机号不正确,请重新输入！");
                continue;
            }
            u.setPhoneNumber(personPhone);
            break;
        }
        list.add(u);
        System.out.println("注册成功！");
    }
    //登陆
    public static void login( ArrayList<user> list) {
        Scanner sc = new Scanner(System.in);
        user u = new user();
        int meijihui = 0;
        while(true){
            System.out.print("请输入你的用户名:>");
            u.setUserName(sc.next());
            //判断集合中是否有该用户
            int index = zhaoName(list, u.getUserName());
            if(index == -1){
                System.out.println("该用户不存在！请先注册");
                break;
            }
        //上面都是判断用户名是否输入正确的代码
            int count = 3;//计数,密码只能输入三次
            System.out.print("请输入该用户的密码:>");
            u.setPassward(sc.next());
            if(count == 0){
                System.out.println("你已经没有机会了！");
                meijihui = 1;
                break;
            }
            //输入验证码
            yzm y = new yzm();
            String yanZhengMa = yzm.cjyzm();
            System.out.println("请输入以下验证码:>"  + yanZhengMa );
            String yy = sc.next();
            int a = 0;//密码错了就把他改成1，防止下面的验证码直接出去了
            //验证密码
            if(!u.getPassward().equals(list.get(index).getPassward())){
                count--;
                System.out.println("密码输入错误！你还有" + count + "次机会");
                a = 1;
            }
            if((yy.equals(yanZhengMa)) && a == 0){
                System.out.println("登陆成功！"); 
                break; 
              }    
        }
        if(meijihui == 0){
            StuSystem gongxi = new StuSystem();
            gongxi.StuSystemtrue();
        }

    }
    
    //检查用户名是否符合格式
    public static boolean checkUserName(String userName){
        //用户名长度必须3~15位之间
        int len = userName.length();//减少方法的调用次数
        if(len < 3 && len > 15){
            return false;
        }
        //只能是字母加数字的组合,但是不能是纯数字

        int count = 0;//统计用户名中数字的个数
        for(int i = 0; i < len; i++){
            char c = userName.charAt(i);
            if((c < 0 || c > 9) && (c < 'a' && c > 'z') && (c < 'A' || c > 'Z')){
               return false; 
            }
            if(c >= 0 && c <= 9){
                count++;
            }
        }
        if(count == len){
            return false;
        }
        return true;
    }
    
    //检查用户名是否唯一
    public static boolean contains(ArrayList<user> list, String userName){
        for(int i = 0; i < list.size(); i++){
            user u = list.get(i);
            if(u.getUserName().equals(userName)){
                return false;
            }
        }
        return true;//原集合中没有该用户名

    }
    
    //判断身份证号是否符合规矩
    public static boolean panDuanPersonId(String personid){
        //长度为18位
        int len = personid.length();
        if(len != 18){
            return false;
        }
        //不能以0开头
        if(personid.charAt(0) == 0){
            return false;
        }
        //前17位必须都是数字，最后一位可以是x，X
        for(int i = 0; i < len ; i++){
            char c = personid.charAt(i);
            if(i != len - 1){
                if(c < 0 && c > 9){
                        return false;
                    }
            }else{
                if((c < 0 || c > 9 ) && c != 'X' && c != 'x'){
                    return false;
                }
            }  
        }
        return true;
    }
    
    //判断手机号是否符合要求
    public static boolean panDuanPhone(String personPhone){
        //长度是11位
        int len = personPhone.length();
        if(len != 11){
            return false;
        }
        //不能以0为开头
        if(personPhone.charAt(0) == 0){
            return false;
        }
        //必须都是数字
        for(int i = 0; i < len; i++){
            char c = personPhone.charAt(i);
            if(c < '0' || c > '9'){
                return false;
            }   
        }
        return true;
    }
    
    //判断集合中是否存在该用户名，存在返回索引，不存在返回-1
    public static int zhaoName(ArrayList<user> list, String userName){
        for(int i = 0; i < list.size(); i++){
            if(userName.equals(list.get(i).getUserName())){
                return i;
            }
        }
        return -1;
    }

   
}
